package ThreadTest;


//多线程能够提高任务完成的效率，但是使用多线程也要看具体场景，多线程适合CPU密集型的程序，需要进行大量计算的，这时使用多线程就可以充分利用CPU的多核资源
//注意：并不是说一个线程消耗600多ms，那两个线程就是消耗300多ms。这两个线程底层是并发执行还是并行执行是不确定的！
//注意：如果你计算的count比较小时，使用多线程也不一定会更快，因为创建线程也是需要消耗时间的
public class ThreadJoin {
    public static final long count = 10_0000_0000;

    public static void serial(){
        //开始时间
        long beg = System.currentTimeMillis();

        long a = 0;
        for (int i = 0; i < count; i++) {
            a++;
        }

        long b = 0;
        for (int i = 0; i < count; i++) {
            b++;
        }

        //结束时间
        long end = System.currentTimeMillis();

        System.out.println("串行执行消耗时间："+(end - beg) + "ms");
    }


    public static void concurrency() throws InterruptedException {
        long beg = System.currentTimeMillis();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                long a = 0;
                for (int i = 0; i < count; i++) {
                    a++;
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                long b = 0;
                for (int i = 0; i < count; i++) {
                    b++;
                }
            }
        });
        t2.start();

        //首先调用join方法的是main线程，意味让main线程先执行
        //在这里t1，t2都在执行 当t1，t2两个线程都结束 才会执行main线程
        //有个问题：由于线程调度是随机的，我们也不知道t1，t2到底谁先结束
        //假设t1先结束：先执行t1.join，等待t1结束后再执行t2.join，等t2结束后再执行main线程
        //假设t2先结束：先执行t1.join等待t1执行完，t2执行完了但是t1还没有结束，main线程任然阻塞在t1.join。过一会儿，t1结束了，执行t2.join，此时t2已经结束
        t1.join(10000);
        t2.join(10000);//在10秒钟等不到t1t2结束，main就不等了，如果不设置时间main就会死等

        //此处不能直接记录时间，求这个时间戳的代码是在main线程中
        //main 和 t1，t2之间是并发执行的关系，此处的t1，t2还没有执行完就开始记录时间显然是不正确的
        //正确做法是让main线程等待t1，t2线程执行完了后再记录时间
        //而前面的 join 就是等待线程结束，t1.join就是让main线程等待t1执行结束，此时main线程就进入阻塞状态，直到t1结束
        long end = System.currentTimeMillis();

        System.out.println("并发执行消耗时间："+ (end - beg) + "ms");
    }

    public static void main(String[] args) throws InterruptedException {
        serial();
        concurrency();
    }
}
